package com.link.serve.tcp.linkdata;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * 集群下主机间的 Channel 管理
 */
public class ClusterChannelManager {

    /**
     * 使用 ConcurrentMap 存储主机与其 Channel 映射
     * key 为主机 ID 或主机名称
     * value 为与主机保持连接的 Channel
     */
    private static final ConcurrentMap<String, Channel> clusterChannelMap = new ConcurrentHashMap<>();

    /**
     * 添加一个主机的 Channel
     *
     * @param serverId 主机 ID 或名称
     * @param channel  与主机的 Channel
     */
    public static void addChannel(String serverId, Channel channel) {
        clusterChannelMap.put(serverId, channel);
    }

    /**
     * 删除一个主机的 Channel
     *
     * @param serverId 主机 ID 或名称
     */
    public static void removeChannel(String serverId) {
        clusterChannelMap.remove(serverId);
    }

    /**
     * 获取一个主机的 Channel
     *
     * @param serverId 主机 ID 或名称
     * @return 与主机的 Channel
     */
    public static Channel getChannel(String serverId) {
        return clusterChannelMap.get(serverId);
    }

    /**
     * 判断某主机是否在线
     *
     * @param serverId 主机 ID 或名称
     * @return boolean 是否在线
     */
    public static boolean isServerOnline(String serverId) {
        return clusterChannelMap.containsKey(serverId);
    }

    /**
     * 获取在线主机数量
     *
     * @return int 在线主机数量
     */
    public static int getOnlineServerCount() {
        return clusterChannelMap.size();
    }

    /**
     * 清空所有主机的 Channel
     * 适用于服务停止或集群重启时的清理逻辑
     */
    public static void clearAllChannels() {
        clusterChannelMap.clear();
    }

    /**
     * 打印所有在线主机的详细信息
     */
    public static void logAllChannels() {
        clusterChannelMap.forEach((serverId, channel) -> {
            System.out.println("主机ID: " + serverId + ", Channel: " + channel);
        });
    }
}